package com.example.generic_;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型使用的注意事项和细节
 */
public class GenericDetail {
    public static void main(String[] args) {
        //1. interface List<T>{} , public class HashSet<E>{} 等等
        //说明 泛型的<>中只能是引用类型, 不能是基本数据类型
        ArrayList<Integer> list = new ArrayList<>();
        //List<int> list2 = new ArrayList<int>();//错误 Type argument cannot be of primitive type


        //2. 在指定泛型具体类型后, 可以传入该类型或其子类类型
        Pig<A> aPig = new Pig<A>(new A());
//        Pig<A> dPig = new Pig<A>(new D());//A的父类类型不行
        Pig<A> bPig = new Pig<A>(new B());//A的子类类型也可以
//        Pig<A> cPig = new Pig<A>(new C());//报错


        //3. 泛型使用形式: 后面<>中可以不加类型
        List<Integer> list1 = new ArrayList<Integer>();
        List<Integer> list2 = new ArrayList<>();


        //4. 如果我们这样写List list3 = new ArrayList(); 默认给它的泛型是[<E> E就是Object]
        ArrayList arrayList = new ArrayList();//等价于下面的
        ArrayList<Object> arrayList1 = new ArrayList();

    }
}

class D {}
class A extends D{}
class B extends A{}
class C {}

class Pig<E> {
    E e;

    public Pig(E e){
        this.e = e;
    }
}